package com.wyix.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;
import java.util.stream.Collectors;

/**
 * @author wangdx
 * @since 2025/8/6
 */
public class JdkProxyHandler implements InvocationHandler {

    private final Object target;  // 被代理对象
    private final String loginUser;  // 当前登录用户（用于权限校验）

    public JdkProxyHandler(Object target, String loginUser) {
        this.target = target;
        this.loginUser = loginUser;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 前置通知：日志记录
        String methodName = method.getName();
        System.out.println("\n[JDK前置通知] 时间：" + new Date() + " 调用方法：" + methodName + " 参数：" + String.join(",", (String) args[0], String.valueOf(args[1])));

        System.out.println("\n[JDK前置通知] 时间：" + new Date() + " 调用方法：" + methodName + " 参数：" +
                Arrays.stream(args) // 将参数数组转换为流
                        .map(String::valueOf) // 每个参数转换为字符串（处理null）
                        .collect(Collectors.joining(","))); // 用逗号拼接所有参数

        // 环绕通知：登录校验（仅addPoints方法）
        if ("addPoints".equals(methodName)) {
            if (!loginUser.equals(args[0])) {
                return "错误：非登录用户不能为他人增加积分！";
            }
        }

        // 执行原始方法
        Object result = method.invoke(target, args);

        // 后置通知：记录结果
        System.out.println("[JDK后置通知] 方法：" + methodName + " 执行结果：" + result);

        return result;
    }
}
